package ru.qatools.clay.aether.internal;
import org.apache.maven.repository.internal.DefaultArtifactDescriptorReader;
import org.apache.maven.repository.internal.DefaultVersionRangeResolver;
import org.apache.maven.repository.internal.DefaultVersionResolver;
import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
import org.apache.maven.settings.*;
import org.apache.maven.settings.Proxy;
import org.eclipse.aether.DefaultRepositoryCache;
import org.eclipse.aether.DefaultRepositorySystemSession;
import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory;
import org.eclipse.aether.impl.*;
import org.eclipse.aether.internal.impl.*;
import org.eclipse.aether.repository.*;
import org.eclipse.aether.repository.RepositoryPolicy;
import org.eclipse.aether.spi.connector.RepositoryConnectorFactory;
import org.eclipse.aether.spi.connector.transport.TransporterFactory;
import org.eclipse.aether.spi.log.LoggerFactory;
import org.eclipse.aether.spi.log.NullLoggerFactory;
import org.eclipse.aether.transport.file.FileTransporterFactory;
import org.eclipse.aether.transport.http.HttpTransporterFactory;
import org.eclipse.aether.util.repository.*;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* Warning: it's not a part of public API
* @author Dmitry Baev charlie@yandex-team.ru
*/
public final class AetherUtils {
AetherUtils() {
}
/**
* Create a new {@link org.eclipse.aether.RepositorySystem}
*/
public static RepositorySystem newRepositorySystem() {
DefaultRepositorySystem repositorySystem = new DefaultRepositorySystem();
DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator();
locator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class);
locator.addService(TransporterFactory.class, FileTransporterFactory.class);
locator.addService(TransporterFactory.class, HttpTransporterFactory.class);
locator.setService(LoggerFactory.class, NullLoggerFactory.class);
locator.setService(VersionResolver.class, DefaultVersionResolver.class);
locator.setService(VersionRangeResolver.class, DefaultVersionRangeResolver.class);
locator.setService(ArtifactResolver.class, DefaultArtifactResolver.class);
locator.setService(MetadataResolver.class, DefaultMetadataResolver.class);
locator.setService(ArtifactDescriptorReader.class, DefaultArtifactDescriptorReader.class);
locator.setService(DependencyCollector.class, DefaultDependencyCollector.class);
locator.setService(Installer.class, DefaultInstaller.class);
locator.setService(Deployer.class, DefaultDeployer.class);
locator.setService(LocalRepositoryProvider.class, DefaultLocalRepositoryProvider.class);
locator.setService(SyncContextFactory.class, DefaultSyncContextFactory.class);
repositorySystem.initService(locator);
return repositorySystem;
}
/**
* Create a new {@link org.eclipse.aether.RepositorySystemSession} from given
* {@link org.eclipse.aether.RepositorySystem}, {@link org.apache.maven.settings.Settings} and
* local repository file
*/
public static RepositorySystemSession newSession(RepositorySystem system, Settings settings, File localRepoDir) {
DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession();
LocalRepository localRepo = new LocalRepository(localRepoDir.getAbsolutePath());
session.setLocalRepositoryManager(system.newLocalRepositoryManager(session, localRepo));
session.setUpdatePolicy(RepositoryPolicy.UPDATE_POLICY_ALWAYS);
if (settings != null) {
session.setOffline(settings.isOffline());
session.setMirrorSelector(newMirrorSelector(settings.getMirrors()));
session.setAuthenticationSelector(newAuthSelector(settings.getServers()));
session.setCache(new DefaultRepositoryCache());
session.setProxySelector(newProxySelector(settings.getProxies()));
}
return session;
}
/**
* Create a new {@link org.eclipse.aether.repository.ProxySelector} from given list of
* {@link org.apache.maven.settings.Proxy}
*/
public static ProxySelector newProxySelector(List<Proxy> proxies) {
DefaultProxySelector proxySelector = new DefaultProxySelector();
for (Proxy proxy : proxies) {
Authentication auth = new AuthenticationBuilder()
.addUsername(proxy.getUsername())
.addPassword(proxy.getPassword())
.build();
proxySelector.add(new org.eclipse.aether.repository.Proxy(
proxy.getProtocol(),
proxy.getHost(),
proxy.getPort(),
auth),
proxy.getNonProxyHosts()
);
}
return proxySelector;
}
/**
* Create a new {@link org.eclipse.aether.repository.MirrorSelector} from given
* {@link org.apache.maven.settings.Mirror}
*/
public static MirrorSelector newMirrorSelector(List<Mirror> mirrors) {
DefaultMirrorSelector selector = new DefaultMirrorSelector();
for (Mirror mirror : mirrors) {
selector.add(mirror.getId(), mirror.getUrl(), mirror.getLayout(),
false, mirror.getMirrorOf(), mirror.getMirrorOfLayouts()
);
}
return selector;
}
/**
* Create a new {@link org.eclipse.aether.repository.AuthenticationSelector} from given
* list of {@link org.apache.maven.settings.Server}
*/
public static AuthenticationSelector newAuthSelector(List<Server> servers) {
DefaultAuthenticationSelector selector = new DefaultAuthenticationSelector();
for (Server server : servers) {
AuthenticationBuilder auth = new AuthenticationBuilder();
auth.addUsername(server.getUsername()).addPassword(server.getPassword());
auth.addPrivateKey(server.getPrivateKey(), server.getPassphrase());
selector.add(server.getId(), auth.build());
}
return new ConservativeAuthenticationSelector(selector);
}
/**
* Create a new list of {@link org.eclipse.aether.repository.RemoteRepository} from given
* {@link org.eclipse.aether.RepositorySystemSession} and {@link org.apache.maven.settings.Settings}
*/
public static List<RemoteRepository> getRepositoriesAsList(RepositorySystemSession session, Settings settings) {
if (settings == null) {
return Collections.emptyList();
}
List<RemoteRepository> repositories = new ArrayList<>();
for (String profileName : settings.getActiveProfiles()) {
Profile profile = settings.getProfilesAsMap().get(profileName);
for (Repository repository : profile.getRepositories()) {
repositories.add(toRemoteRepository(repository, session));
}
}
return repositories;
}
/**
* Create a new {@link org.eclipse.aether.repository.RemoteRepository} from given
* {@link org.apache.maven.settings.Repository} and {@link org.eclipse.aether.RepositorySystemSession}
*/
public static RemoteRepository toRemoteRepository(Repository repo, RepositorySystemSession session) {
RemoteRepository.Builder prototypeBuilder =
new RemoteRepository.Builder(repo.getId(), repo.getLayout(), repo.getUrl());
prototypeBuilder.setSnapshotPolicy(transformPolicy(repo.getSnapshots()));
prototypeBuilder.setReleasePolicy(transformPolicy(repo.getReleases()));
RemoteRepository prototype = prototypeBuilder.build();
RemoteRepository.Builder builder = new RemoteRepository.Builder(prototype);
builder.setAuthentication(session.getAuthenticationSelector().getAuthentication(prototype));
builder.setProxy(session.getProxySelector().getProxy(prototype));
builder.setMirroredRepositories(Arrays.asList(session.getMirrorSelector().getMirror(prototype)));
return builder.build();
}
/**
* Create a new {@link org.eclipse.aether.repository.RemoteRepository} from given
* {@link org.apache.maven.model.Repository} and {@link org.eclipse.aether.RepositorySystemSession}
*/
public static RemoteRepository toRemoteRepository(org.apache.maven.model.Repository repo, RepositorySystemSession session) {
RemoteRepository.Builder prototypeBuilder =
new RemoteRepository.Builder(repo.getId(), repo.getLayout(), repo.getUrl());
prototypeBuilder.setSnapshotPolicy(transformPolicy(repo.getSnapshots()));
prototypeBuilder.setReleasePolicy(transformPolicy(repo.getReleases()));
RemoteRepository prototype = prototypeBuilder.build();
RemoteRepository.Builder builder = new RemoteRepository.Builder(prototype);
builder.setAuthentication(session.getAuthenticationSelector().getAuthentication(prototype));
builder.setProxy(session.getProxySelector().getProxy(prototype));
builder.setMirroredRepositories(Arrays.asList(session.getMirrorSelector().getMirror(prototype)));
return builder.build();
}
/**
* Convert {@link org.apache.maven.model.RepositoryPolicy} to
* {@link org.eclipse.aether.repository.RepositoryPolicy}
*
* @param policy the policy to convert, may be {@code null}
*/
public static RepositoryPolicy transformPolicy(org.apache.maven.model.RepositoryPolicy policy) {
return policy == null ? null : newRepositoryPolicy(
policy.isEnabled(),
policy.getUpdatePolicy(),
policy.getChecksumPolicy()
);
}
/**
* Convert {@link org.apache.maven.settings.RepositoryPolicy} to
* {@link org.eclipse.aether.repository.RepositoryPolicy}
*p
* @param policy the policy to convert, may be {@code null}
*/
public static RepositoryPolicy transformPolicy(org.apache.maven.settings.RepositoryPolicy policy) {
return policy == null ? null : newRepositoryPolicy(
policy.isEnabled(),
policy.getUpdatePolicy(),
policy.getChecksumPolicy()
);
}
/**
* Creates a new policy with the specified settings.
*
* @param enabled A flag whether the associated repository should be accessed or not.
* @param updatePolicy The update interval after which locally cached data from the repository is considered stale
* and should be refetched, may be {@code null}.
* @param checksumPolicy The way checksum verification should be handled, may be {@code null}.
*/
public static RepositoryPolicy newRepositoryPolicy(boolean enabled, String updatePolicy, String checksumPolicy) {
return new RepositoryPolicy(enabled, updatePolicy, checksumPolicy);
}
}